home *** CD-ROM | disk | FTP | other *** search
/ Aminet 24 / Aminet 24 (1998)(GTI - Schatztruhe)[!][Apr 1998].iso / Aminet / dev / c / AmiVoGL_MDEV.lha / examples / views.c < prev    next >
C/C++ Source or Header  |  1997-12-26  |  4KB  |  179 lines

  1. #include <stdio.h>
  2.  
  3. #ifdef SGI
  4. #include "gl.h"
  5. #include "device.h"
  6. #include "hershey.h"
  7. #else
  8. #include "vogl.h"
  9. #include "vodevice.h"
  10. #endif
  11.  
  12.  
  13. void drawtetra(void);                                  /* views.c         */
  14. int main(int,char **);                                 /* views.c         */
  15.  
  16. /*
  17.  * drawtetra
  18.  *
  19.  *    generate a tetraedron as a series of move draws
  20.  */
  21. void drawtetra(void)
  22. {
  23.     
  24.     move(-0.5,  0.866, -0.5);
  25.     draw(-0.5, -0.866, -0.5);
  26.     draw( 1.0,  0.0,   -0.5);
  27.     draw(-0.5,  0.866, -0.5);
  28.     draw( 0.0,  0.0,    1.5);
  29.     draw(-0.5, -0.866, -0.5);
  30.     move( 1.0,  0.0,   -0.5);
  31.     draw( 0.0,  0.0,    1.5);
  32.     
  33.     /* 
  34.      * Label the vertices.
  35.      */
  36.     color(WHITE);
  37.     htextsize(0.3, 0.5);
  38.     move(-0.5,  0.866, -0.5);
  39.     hdrawchar('a');
  40.     move(-0.5, -0.866, -0.5);
  41.     hdrawchar('b');
  42.     move( 1.0,  0.0,   -0.5);
  43.     hdrawchar('c');
  44.     move( 0.0,  0.0,    1.5);
  45.     hdrawchar('d');
  46. }
  47.  
  48. /*
  49.  *    Shows various combinations of viewing and
  50.  *    projection transformations.
  51.  */
  52. int main(
  53.   int argc,
  54.   char **argv)
  55. {
  56.     Screencoord    minx, maxx, miny, maxy;
  57.     short        val;
  58.  
  59.  
  60.     winopen("views");
  61.     qdevice(KEYBD);
  62.     unqdevice(INPUTCHANGE);
  63.  
  64.     hfont("times.r");
  65.  
  66.     color(BLACK);
  67.     clear();
  68.  
  69.     /*
  70.      * we want to draw just within the boundaries of the screen
  71.      */
  72.     getviewport(&minx, &maxx, &miny, &maxy);
  73.     viewport(maxx / 10, maxx / 10 * 9, maxy / 10, maxy / 10 * 9);
  74.  
  75.  
  76.     ortho2(-5.0, 5.0, -5.0, 5.0);    /* set the world size */
  77.  
  78.     color(RED);
  79.     rect(-4.99, -4.99, 4.99, 4.99);    /* draw a boundary frame */
  80.  
  81.     /*
  82.      * set up a perspective projection with a field of view of
  83.      * 40.0 degrees, aspect ratio of 1.0, near clipping plane 0.1,
  84.      * and the far clipping plane at 1000.0.
  85.      */
  86.     perspective(400, 1.0, 0.1, 1000.0);
  87.  
  88.     /*
  89.      * we want the drawing to be done with our eye point at (5.0, 8.0, 5.0)
  90.      * looking towards (0.0, 0.0, 0.0). The last parameter gives a twist
  91.      * in degrees around the line of sight, in this case zero.
  92.      */
  93.     lookat(5.0, 8.0, 5.0, 0.0, 0.0, 0.0, (Angle)0);
  94.  
  95.     drawtetra();
  96.  
  97.     move2(-4.5, -4.5);
  98.     htextsize(0.6, 0.9); 
  99.     hcharstr("perspective/lookat");
  100.  
  101.     qread(&val);
  102.  
  103.     /*
  104.      * window can also be used to give a perspective projection. Its
  105.      * arguments are 6 clipping planes, left, right, bottom, top, near,
  106.      * and far.
  107.      */
  108.     window(-5.0, 5.0, -5.0, 5.0, -5.0, 5.0);
  109.     /*
  110.      * as window replaces the current transformation matrix we must
  111.      * specify our viewpoint again.
  112.      */
  113.     lookat(5.0, 8.0, 5.0, 0.0, 0.0, 0.0, 0.0);
  114.  
  115.     color(BLACK);    
  116.     clear();
  117.  
  118.     color(GREEN);
  119.     rect(-4.99, -4.99, 4.99, 4.99);    /* draw a boundary frame */
  120.  
  121.     drawtetra();
  122.  
  123.     move2(-4.5,-4.5);
  124.     htextsize(0.6, 0.9);
  125.     hcharstr("window/lookat");
  126.  
  127.     qread(&val);
  128.  
  129.     /*
  130.      * set up our original perspective projection again.
  131.      */
  132.     perspective(400, 1.0, 0.1, 1000.0);
  133.     /*
  134.      * polarview also specifies our viewpoint, but, unlike lookat, in polar
  135.      * coordinates. Its arguments are the distance from the world origin, an
  136.      * azimuthal angle in the x-y plane measured from the y axis, an 
  137.      * incidence angle in the y-z plane measured from the z axis, and a
  138.      * twist around the line of sight.
  139.      */
  140.     polarview(15.0, 30.0, 30.0, 30.0);
  141.  
  142.     color(BLACK);
  143.     clear();
  144.  
  145.     color(MAGENTA);
  146.     rect(-4.99, -4.99, 4.99, 4.99);    /* draw a boundary frame */
  147.  
  148.     drawtetra();
  149.  
  150.     move2(-4.5,-4.5);
  151.     htextsize(0.6, 0.9);
  152.     hcharstr("perspective/polarview");
  153.  
  154.     qread(&val);
  155.  
  156.     /*
  157.      * once more with window for comparison
  158.      */
  159.     window(-4.0, 4.0, -4.0, 4.0, -4.0, 4.0);
  160.     polarview(6.0, 200, -300, 700);
  161.  
  162.     color(BLACK);
  163.     clear();
  164.  
  165.     color(YELLOW);
  166.     rect(-4.99, -4.99, 4.99, 4.99);    /* draw a boundary frame */
  167.  
  168.     drawtetra();
  169.  
  170.     move2(-4.5,-4.5);
  171.     htextsize(0.6, 0.9);
  172.     hcharstr("window/polarview");
  173.  
  174.     qread(&val);
  175.  
  176.     gexit();
  177. }
  178.  
  179.